﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using InterfazGrafico.LibreriaClases.Clases;
using InterfazGrafico.LibreriaConstantes;
using InterfazGrafico.LibreriaConstantes.Elementos;

namespace InterfazGrafico.LibreriaClases.Propiedades
{
    /// <summary>
    /// Almacena las propiedades de un elemento específico.
    /// </summary>
    public class PBuscarDuplicadosConTabla : Propiedades
    {
        /// <summary>
        /// Entrada de datos.
        /// </summary>
        public string Entrada
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicadosConTabla.Entrada);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicadosConTabla.Entrada, value);
            }
        }

        /// <summary>
        /// Salida de datos.
        /// </summary>
        public string Salida
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicadosConTabla.Salida);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicadosConTabla.Salida, value);
            }
        }

        /// <summary>
        /// Tabla de datos.
        /// </summary>
        public string Tabla
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicadosConTabla.Tabla);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicadosConTabla.Tabla, value);
            }
        }

        /// <summary>
        /// Estructura de entrada.
        /// </summary>
        public string EstructuraEntrada
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicadosConTabla.EstructuraEntrada);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicadosConTabla.EstructuraEntrada, value);
            }
        }

        /// <summary>
        /// Estructura de salida.
        /// </summary>
        public string EstructuraSalida
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicadosConTabla.EstructuraSalida);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicadosConTabla.EstructuraSalida, value);
            }
        }

        /// <summary>
        /// Estructura de tabla.
        /// </summary>
        public string EstructuraTabla
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicadosConTabla.EstructuraTabla);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicadosConTabla.EstructuraTabla, value);
            }
        }

        /// <summary>
        /// Fichero con la definición de las funciones de comparación.
        /// </summary>
        public string FuncionesComparacion
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicadosConTabla.FuncionesComparacion);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicadosConTabla.FuncionesComparacion, value);
            }
        }

        /// <summary>
        /// Fichero con la definición de los patrones de comparación.
        /// </summary>
        public string PatronesComparacion
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicadosConTabla.PatronesComparacion);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicadosConTabla.PatronesComparacion, value);
            }
        }

        /// <summary>
        /// Listado pares tipos/campos de patrones.
        /// </summary>
        public Dictionary<int, string> DiccionarioTiposPatronesCampos
        {
            get
            {
                return this.getPropiedadDiccionarioIntString(CBuscarDuplicadosConTabla.CamposTiposPatrones);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicadosConTabla.CamposTiposPatrones, value);
            }
        }

        /// <summary>
        /// Campo clave de los datos.
        /// </summary>
        public string CampoOrigenClave
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicadosConTabla.CampoOrigenClave);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicadosConTabla.CampoOrigenClave, value);
            }
        }

        /// <summary>
        /// Campo destino de los datos.
        /// </summary>
        public string CampoDestinoClave
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicadosConTabla.CampoDestinoClave);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicadosConTabla.CampoDestinoClave, value);
            }
        }

        /// <summary>
        /// Lista campos que conforman la ventana de datos del maestro.
        /// </summary>
        public List<string> ListaCamposVentanaMaestro
        {
            get
            {
                return this.getPropiedadListaString(CBuscarDuplicadosConTabla.CamposVentanaMaestro);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicadosConTabla.CamposVentanaMaestro, value);
            }
        }

        /// <summary>
        /// Lista campos que conforman la ventana de datos de la tabla.
        /// </summary>
        public List<string> ListaCamposVentanaTabla
        {
            get
            {
                return this.getPropiedadListaString(CBuscarDuplicadosConTabla.CamposVentanaTabla);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicadosConTabla.CamposVentanaTabla, value);
            }
        }

        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public PBuscarDuplicadosConTabla()
            : base()
        {
        }

        /// <summary>
        /// Obtiene los parámetros a partir del fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        override public void leer(string fichero)
        {
            try
            {
                base.leer(fichero);
                XmlDocument xml = LeerXml.AbrirFicheroParametros(fichero);

                try
                { this.Entrada = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicadosConTabla.RutaEntrada); }
                catch (Exception)
                { this.Entrada = string.Empty; };

                try
                { this.Salida = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicadosConTabla.RutaSalida); }
                catch (Exception)
                { this.Salida = string.Empty; }

                try
                { this.Tabla = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicadosConTabla.RutaTabla); }
                catch (Exception)
                { this.Tabla = string.Empty; }

                try
                { this.EstructuraEntrada = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicadosConTabla.RutaEstructuraEntrada); }
                catch (Exception)
                { this.EstructuraEntrada = string.Empty; }

                try
                { this.EstructuraSalida = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicadosConTabla.RutaEstructuraSalida); }
                catch (Exception)
                { this.EstructuraSalida = string.Empty; }

                try
                { this.EstructuraTabla = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicadosConTabla.RutaEstructuraTabla); }
                catch (Exception)
                { this.EstructuraTabla = string.Empty; }

                try
                { this.FuncionesComparacion = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicadosConTabla.RutaFuncionesComparacion); }
                catch (Exception)
                { this.FuncionesComparacion = string.Empty; }

                try
                { this.PatronesComparacion = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicadosConTabla.RutaPatronesComparacion); }
                catch (Exception)
                { this.PatronesComparacion = string.Empty; }

                try
                { this.CampoOrigenClave = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicadosConTabla.RutaOrigenClave); }
                catch (Exception)
                { this.CampoOrigenClave = string.Empty; }

                try
                { this.CampoDestinoClave = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicadosConTabla.RutaDestinoClave); }
                catch (Exception)
                { this.CampoDestinoClave = string.Empty; }

                // Campos ventana Maestro
                try
                {
                    int numeroCampos = LeerXml.ObtenerNumeroNodosCampo(xml, CBuscarDuplicadosConTabla.RutaCamposVentanaMaestro);
                    for (int indiceCampo = 0; indiceCampo < numeroCampos; indiceCampo++)
                    {
                        string campo = string.Empty;
                        try
                        { campo = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicadosConTabla.RutaCamposVentanaMaestro, indiceCampo); }
                        catch (Exception)
                        { continue; }
                        if (!string.Empty.Equals(campo))
                            this.ListaCamposVentanaMaestro.Add(campo);
                    }
                }
                catch (Exception)
                { this.ListaCamposVentanaMaestro = new List<string>(); }

                // Campos ventana Tabla
                try
                {
                    int numeroCampos = LeerXml.ObtenerNumeroNodosCampo(xml, CBuscarDuplicadosConTabla.RutaCamposVentanaTabla);
                    for (int indiceCampo = 0; indiceCampo < numeroCampos; indiceCampo++)
                    {
                        string campo = string.Empty;
                        try
                        { campo = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicadosConTabla.RutaCamposVentanaTabla, indiceCampo); }
                        catch (Exception)
                        { continue; }
                        if (!string.Empty.Equals(campo))
                            this.ListaCamposVentanaTabla.Add(campo);
                    }
                }
                catch (Exception)
                { this.ListaCamposVentanaTabla = new List<string>(); }

                // Tipos patrones
                try
                {
                    int numeroTipos = LeerXml.ObtenerNumeroNodosCampo(xml, CBuscarDuplicadosConTabla.RutaCamposPatrones);
                    for (int indiceTipo = 0; indiceTipo < numeroTipos; indiceTipo++)
                    {
                        int tipo = -1;
                        try
                        { tipo = int.Parse(LeerXml.ObtenerValorCampo(xml, CBuscarDuplicadosConTabla.RutaCamposPatrones, indiceTipo, Constantes.NodoXMLActual + CBuscarDuplicadosConTabla.NodoPatronesTipoPatron)); }
                        catch (Exception)
                        { continue; }

                        if (tipo >= 0)
                        {
                            string campo = string.Empty;
                            try
                            { campo = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicadosConTabla.RutaCamposPatrones, indiceTipo, Constantes.NodoXMLActual + CBuscarDuplicadosConTabla.NodoPatronesCampoPatron); }
                            catch (Exception)
                            { campo = string.Empty; }

                            this.DiccionarioTiposPatronesCampos.Add(tipo, campo);
                        }
                    }
                }
                catch (Exception)
                {
                    this.DiccionarioTiposPatronesCampos = new Dictionary<int, string>();
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException(Constantes.ERROR_LECTURA_FICHERO_CONFIGURACION, ex);
            }
        }

        /// <summary>
        /// Escribe los parámetros al fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        public override void escribir(string fichero)
        {
            try
            {
                base.escribir(fichero);
                XmlWriter xml = EscribirXml.AbrirFicheroParametros(fichero);
                EscribirXml.InicioElemento(xml, CBuscarDuplicadosConTabla.NodoRaiz);
                EscribirXml.EscribeNodo(xml, CBuscarDuplicadosConTabla.NodoEntrada, Entrada);
                EscribirXml.EscribeNodo(xml, CBuscarDuplicadosConTabla.NodoSalida, Salida);
                EscribirXml.EscribeNodo(xml, CBuscarDuplicadosConTabla.NodoTabla, Tabla);
                EscribirXml.EscribeNodo(xml, CBuscarDuplicadosConTabla.NodoEstructuraEntrada, EstructuraEntrada);
                EscribirXml.EscribeNodo(xml, CBuscarDuplicadosConTabla.NodoEstructuraSalida, EstructuraSalida);
                EscribirXml.EscribeNodo(xml, CBuscarDuplicadosConTabla.NodoEstructuraTabla, EstructuraTabla);

                // Configuración
                EscribirXml.InicioElemento(xml, CBuscarDuplicadosConTabla.NodoConfiguracion);
                EscribirXml.EscribeNodo(xml, CBuscarDuplicadosConTabla.NodoFuncionesComparacion, FuncionesComparacion);
                EscribirXml.EscribeNodo(xml, CBuscarDuplicadosConTabla.NodoPatronesComparacion, PatronesComparacion);
                EscribirXml.EscribeNodo(xml, CBuscarDuplicadosConTabla.NodoCampoOrigenClave, CampoOrigenClave);
                EscribirXml.EscribeNodo(xml, CBuscarDuplicadosConTabla.NodoCampoDestinoClave, CampoDestinoClave);

                //Campos ventana Maestro
                EscribirXml.InicioElemento(xml, CBuscarDuplicadosConTabla.CamposVentanaMaestro);
                foreach (string campo in ListaCamposVentanaMaestro)
                    EscribirXml.EscribeNodo(xml, CBuscarDuplicadosConTabla.NodoCampoVentana, campo);
                EscribirXml.FinElemento(xml);

                //Campos ventana Tabla
                EscribirXml.InicioElemento(xml, CBuscarDuplicadosConTabla.CamposVentanaTabla);
                foreach (string campo in ListaCamposVentanaTabla)
                    EscribirXml.EscribeNodo(xml, CBuscarDuplicadosConTabla.NodoCampoVentana, campo);
                EscribirXml.FinElemento(xml);

                // Tipos patrones
                EscribirXml.InicioElemento(xml, CBuscarDuplicadosConTabla.NodoCamposPatrones);
                foreach (int tipo in DiccionarioTiposPatronesCampos.Keys)
                {
                    EscribirXml.InicioElemento(xml, CBuscarDuplicadosConTabla.NodoCampoPatron);
                    EscribirXml.EscribeNodo(xml, CBuscarDuplicadosConTabla.NodoPatronesTipoPatron, tipo.ToString());
                    EscribirXml.EscribeNodo(xml, CBuscarDuplicadosConTabla.NodoPatronesCampoPatron, DiccionarioTiposPatronesCampos[tipo]);
                    EscribirXml.FinElemento(xml);
                }
                EscribirXml.FinElemento(xml);

                EscribirXml.FinElemento(xml);
                EscribirXml.FinElemento(xml);
                EscribirXml.Flush(xml);
                EscribirXml.Close(xml);
            }
            catch (Exception ex)
            {
                throw new ApplicationException(Constantes.ERROR_ESCRITURA_FICHERO_CONFIGURACION, ex);
            }
        }
    }
}
 